﻿using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using ImageResizer.Properties;

namespace ImageResizer.Profiles
{
    /// <summary>
    /// Classe qui gère les profiles de redimensionnement depuis le fichier XML
    /// </summary>
    internal class ProfilesManager
    {
        #region Private vars
        /// <summary>
        /// XDocument du fichier XML contenant les profiles
        /// </summary>
        private XDocument _xdoc; 
        #endregion

        #region Private constants

        /// <summary>
        /// Nom du fichier de base de données
        /// </summary>
        private readonly string _databaseFile = "Profiles.xml";

        /// <summary>
        /// Nom de l'élément Xml pour un profil
        /// </summary>
        private readonly string _profileXmlElementName = "profile";

        /// <summary>
        /// Nom de l'élement Xml contenant le nom du profil
        /// </summary>
        private readonly string _profileXmlSubElementName = "name";

        /// <summary>
        /// Nom de l'élement Xml contenant la largeur du profil
        /// </summary>
        private readonly string _profileXmlSubElementWidth = "width";

        /// <summary>
        /// Nom de l'élement Xml contenant la hauteur du profil
        /// </summary>
        private readonly string _profileXmlSubElementHeight = "height";

        /// <summary>
        /// Nom de l'élement Xml contenant l'indicateur de profil pour miniature ou non
        /// </summary>
        private readonly string _profileXmlSubElementIsThumbnail = "isthumbnail";
        #endregion

        #region Private properties
        /// <summary>
        /// Obtient le XDocument
        /// </summary>
        private XDocument XmlDocument
        {
            get
            {
                if (_xdoc == null)
                    _xdoc = XDocument.Load(_databaseFile);
                return _xdoc;
            }
        }
        
        #endregion

        #region Public properties
        /// <summary>
        /// Obtient la liste des Profiles existants
        /// </summary>
        public IEnumerable<Profile> ExistingProfiles
        {
            get
            {
                var resultFromXml = from c in XmlDocument.Elements().Elements()
                                    select new { Name = c.Element(_profileXmlSubElementName), Width = c.Element(_profileXmlSubElementWidth), Heihgt = c.Element(_profileXmlSubElementHeight), IsThumbnail = c.Element(_profileXmlSubElementIsThumbnail) };
                foreach (var profileRaw in resultFromXml)
                    yield return new ResizeProfile(profileRaw.Name.Value, profileRaw.Width.Value, profileRaw.Heihgt.Value, bool.Parse(profileRaw.IsThumbnail.Value));
                yield return new KeepSizeProfile(Resources.KeepSizeProfileName);
            }
        } 

        #endregion

        #region Public methods

        /// <summary>
        /// Ajoute un profil
        /// </summary>
        /// <param name="profiletoAdd">le profil à ajouter</param>
        public void AddProfile(Profile profiletoAdd)
        {
            XElement srcTree = new XElement(_profileXmlElementName, new XElement(_profileXmlSubElementName, profiletoAdd.Name),
                                                                    new XElement(_profileXmlSubElementWidth, profiletoAdd.Width),
                                                                    new XElement(_profileXmlSubElementHeight, profiletoAdd.Height));

            if (XmlDocument != null)
            {
                // ReSharper disable PossibleNullReferenceException
                XmlDocument.Elements().FirstOrDefault().Add(srcTree);
                // ReSharper restore PossibleNullReferenceException
                XmlDocument.Save(_databaseFile);
            }
        }

        #endregion
    }
}
